/*
 * ReferenceCounterTemplate.h
 *
 *  Created on: 2011/05/28
 *      Author: naoki
 *
 *      参照カウント型のクラスでは必ず持っている関数というものがあり、これを書くのを楽にする。
 *      #define TYPE ActualTypeと書いてからインクルードすること。ActualTypeは本当の型の名前。
 */

TYPE::TYPE()
: mImpl( 0 ) {
}

TYPE::~TYPE() {
	release();
}

TYPE::TYPE( const TYPE& a )
: mImpl( a.mImpl ) {
	if ( mImpl ) {
		mImpl->refer();
	}
}

void TYPE::release() {
	if ( mImpl ) {
		if ( mImpl->unref() == 0 ) {
			SAFE_DELETE( mImpl );
		}
		mImpl = 0;
	}
}

TYPE& TYPE::operator=( const TYPE& a ) {
	release();
	mImpl = a.mImpl;
	if ( mImpl ) {
		mImpl->refer();
	}
	return *this;
}

bool TYPE::operator==( const TYPE& a ) const {
	return ( mImpl == a.mImpl );
}

bool TYPE::operator!=( const TYPE& a ) const {
	return ( mImpl != a.mImpl );
}

int TYPE::referenceCount() const {
	return ( mImpl ) ? mImpl->referenceCount() : 0;
}

TYPE::operator void*() const {
	return ( mImpl == 0 ) ? 0 : reinterpret_cast<void*>(~0);
}

#undef TYPE
